package config

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
	"os"
	"time"
)

// NewLogger 创建一个新的zap Logger实例
func NewLogger() *zap.Logger {
	// 配置日志文件
	//-------------------------info--------------------------
	// 编码器配置
	encoder := zapcore.NewConsoleEncoder(zapcore.EncoderConfig{
		MessageKey:     "msg",
		LevelKey:       "level",
		TimeKey:        "time",
		NameKey:        "logger",
		CallerKey:      "caller",
		StacktraceKey:  "stacktrace",
		LineEnding:     zapcore.DefaultLineEnding,
		EncodeLevel:    zapcore.CapitalLevelEncoder,
		EncodeTime:     zapcore.TimeEncoderOfLayout(time.DateTime),
		EncodeDuration: zapcore.MillisDurationEncoder,
		EncodeCaller:   zapcore.FullCallerEncoder,
	})
	// 创建zap日志的核心
	infoCore := zapcore.NewCore(
		encoder,
		zapcore.AddSync(&lumberjack.Logger{
			Filename:   "./logs/info.log", //日志文件存放目录，如果文件夹不存在会自动创建
			MaxSize:    20,                //文件大小限制,单位MB
			MaxBackups: 100,               //最大保留日志文件数量
			MaxAge:     30,                //日志文件保留天数
			Compress:   false,             //是否压缩处理
		}), // 输出到文件
		zap.LevelEnablerFunc(func(lev zapcore.Level) bool { //info和debug级别,debug级别是最低的
			return lev < zap.ErrorLevel
		}),
	)
	//-----------------------error-------------------
	// 创建zap日志的核心
	errorCore := zapcore.NewCore(
		encoder,
		zapcore.AddSync(&lumberjack.Logger{
			Filename:   "./logs/error.log", //日志文件存放目录，如果文件夹不存在会自动创建
			MaxSize:    20,                 //文件大小限制,单位MB
			MaxBackups: 100,                //最大保留日志文件数量
			MaxAge:     30,                 //日志文件保留天数
			Compress:   false,              //是否压缩处理
		}), // 输出到文件
		zap.NewAtomicLevelAt(zap.ErrorLevel), // 日志级别
	)
	//---------------console-----------------------
	consoleCore := zapcore.NewCore(
		encoder,
		zapcore.Lock(os.Stdout), // 使用os.Stdout作为输出
		zap.DebugLevel,
	)
	// 创建logger
	logger := zap.New(zapcore.NewTee(consoleCore, infoCore, errorCore), zap.AddStacktrace(zapcore.ErrorLevel), zap.AddCaller())

	defer logger.Sync() // flushes buffer, if any
	return logger
}
